package com.dji.sdk.sample.demo.camera;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.dji.sdk.sample.R;
import com.dji.sdk.sample.internal.controller.DJISampleApplication;
import com.dji.sdk.sample.internal.controller.MainActivity;
import com.dji.sdk.sample.internal.utils.ToastUtils;
import com.dji.sdk.sample.internal.view.PresentableView;
import dji.common.camera.SettingsDefinitions;
import dji.common.error.DJIError;
import dji.common.util.CommonCallbacks;
import dji.sdk.base.BaseProduct;
import dji.sdk.camera.MediaFile;
import dji.sdk.camera.MediaManager;
import java.util.ArrayList;
import java.util.List;
public class MediaPlaybackView extends LinearLayout
implements MediaManager.VideoPlaybackStateListener, PresentableView {
private static final String TAG = MediaPlaybackView.class.getName();
private MediaManager mediaManager;
private List<MediaFile> DJIMediaList = new ArrayList<>();
private boolean isDialogAllowable = false;
private FileListAdapter listAdapter;
private ProgressDialog dialog;
public TextView tv_playbackInfo;
public Button btnResume;
public Button btnPause;
public Button btnStop;
public Button btnSkip;
public Button btnStatus;
private final int SHOW_TOAST = 1;
private final int SHOW_PROGRESS_DIALOG = 2;
private final int HIDE_PROGRESS_DIALOG = 3;
private final int FETCH_FILE_LIST = 6;
private final int NEED_REFRESH_FILE_LIST = 7;
private final int GET_THUMBNAILS = 8;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case SHOW_TOAST:
ToastUtils.setResultToToast((String) msg.obj);
break;
case SHOW_PROGRESS_DIALOG:
showProgressDialog();
break;
case HIDE_PROGRESS_DIALOG:
hideProgressDialog();
break;
case FETCH_FILE_LIST:
getFileList();
break;
case NEED_REFRESH_FILE_LIST:
listAdapter.notifyDataSetChanged();
break;
default:
break;
}
return false;
}
});
private void createProgressDialog() {
dialog = new ProgressDialog(getContext());
dialog.setMessage(getContext().getString(R.string.Message_Waiting));
dialog.setCanceledOnTouchOutside(false);
dialog.setCancelable(false);
ProgressDialog downloadDialog = new ProgressDialog(getContext());
downloadDialog.setTitle(R.string.sync_file_title);
downloadDialog.setIcon(android.R.drawable.ic_dialog_info);
downloadDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
downloadDialog.setCanceledOnTouchOutside(false);
downloadDialog.setCancelable(false);
}
private void showProgressDialog() {
if (dialog != null && isDialogAllowable) {
dialog.show();
}
}
private void hideProgressDialog() {
if (null != dialog && dialog.isShowing()) {
dialog.dismiss();
}
}
private void getFileList() {
DJIMediaList.clear();
mediaManager = DJISampleApplication.getProductInstance().getCamera().getMediaManager();
if (mediaManager != null) {
mediaManager.fetchMediaList(new MediaManager.DownloadListener<List<MediaFile>>() {
@Override
public void onFailure(DJIError error) {
handler.sendMessage(handler.obtainMessage(HIDE_PROGRESS_DIALOG, null));
handler.sendMessage(handler.obtainMessage(SHOW_TOAST, error.getDescription()));
}
@Override
public void onProgress(long total, long current) {
Log.d(TAG, "fetchMediaList onProgress");
}
@Override
public void onRateUpdate(long total, long current, long arg2) {
Log.d(TAG, "fetchMediaList onRateUpdate");
}
@Override
public void onStart() {
Log.d(TAG, "fetchMediaList onStart");
}
@Override
public void onSuccess(List<MediaFile> medias) {
Log.d(TAG, "fetchMediaList onSuccess");
handler.sendMessage(handler.obtainMessage(HIDE_PROGRESS_DIALOG, null));
if (DJIMediaList != null) {
DJIMediaList.clear();
}
for (MediaFile media : medias) {
DJIMediaList.add(media);
}
handler.sendMessage(handler.obtainMessage(NEED_REFRESH_FILE_LIST, null));
handler.removeMessages(GET_THUMBNAILS);
}
});
}
}
private void initUI(Context context) {
setOrientation(HORIZONTAL);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.media_playback, this, true);
ListView listView = (ListView) findViewById(R.id.filelistView);
listAdapter = new FileListAdapter();
listView.setAdapter(listAdapter);
createProgressDialog();
tv_playbackInfo = (TextView) findViewById(R.id.tv_mediaPushInfo);
btnResume = (Button) findViewById(R.id.btnResume);
btnPause = (Button) findViewById(R.id.btnPause);
btnStop = (Button) findViewById(R.id.btnStop);
btnSkip = (Button) findViewById(R.id.btnSeek);
btnStatus = (Button) findViewById(R.id.btnStatus);
btnResume.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaManager.resume(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (null != error) {
handler.sendMessage(handler.obtainMessage(SHOW_TOAST, error.getDescription()));
} else {
Log.e(TAG, "Resume Video Success");
}
}
});
}
});
btnPause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaManager.pause(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (null != error) {
handler.sendMessage(handler.obtainMessage(SHOW_TOAST, error.getDescription()));
} else {
Log.e(TAG, "Pause Video Success");
}
}
});
}
});
btnStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaManager.stop(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (null != error) {
handler.sendMessage(handler.obtainMessage(SHOW_TOAST, error.getDescription()));
} else {
Log.e(TAG, "Stop Video Success");
}
}
});
}
});
btnStatus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MediaPlaybackView.this.post(new Runnable() {
@Override
public void run() {
if (tv_playbackInfo.isShown()) {
tv_playbackInfo.setVisibility(View.INVISIBLE);
} else {
tv_playbackInfo.setVisibility(View.VISIBLE);
}
}
});
}
});
btnSkip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Inflate view and use in alertDialog
LayoutInflater li = LayoutInflater.from(getContext());
View promptsView = li.inflate(R.layout.prompt_input_number, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext());
alertDialogBuilder.setView(promptsView);
final EditText userInput = (EditText) promptsView.findViewById(R.id.editTextDialogUserInput);
// set dialog message
alertDialogBuilder.setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
String ms = userInput.getText().toString();
mediaManager.moveToPosition(Integer.parseInt(ms), new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (null != error) {
handler.sendMessage(handler.obtainMessage(SHOW_TOAST, error.getDescription()));
}
}
});
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
});
}
private boolean initDJIMedia() {
BaseProduct product;
try {
product = DJISampleApplication.getProductInstance();
} catch (Exception exception) {
product = null;
}
if (product == null) {
DJIMediaList.clear();
listAdapter.notifyDataSetChanged();
ToastUtils.setResultToToast(getContext().getResources().getString(R.string.playback_disconnected));
return false;
} else {
if (null != DJISampleApplication.getProductInstance().getCamera()
&& DJISampleApplication.getProductInstance().getCamera().isMediaDownloadModeSupported()) {
mediaManager = DJISampleApplication.getProductInstance().getCamera().getMediaManager();
if (null != mediaManager) {
if (mediaManager.isVideoPlaybackSupported()) {
mediaManager.addMediaUpdatedVideoPlaybackStateListener(this);
}
}
SettingsDefinitions.CameraMode mode = SettingsDefinitions.CameraMode.MEDIA_DOWNLOAD;
Log.e(TAG, "Media Test set Camera Mode " + mode);
DJISampleApplication.getProductInstance()
.getCamera()
.setMode(mode, new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (error == null) {
Log.e(TAG, "Media Test set Camera Mode success");
handler.sendMessage(handler.obtainMessage(SHOW_PROGRESS_DIALOG, null));
handler.sendMessageDelayed(handler.obtainMessage(FETCH_FILE_LIST, null),
2000);
} else {
Log.e(TAG, "Media Test set Camera Mode failure");
handler.sendMessage(handler.obtainMessage(SHOW_TOAST,
error.getDescription()));
}
}
});
} else if (null != DJISampleApplication.getProductInstance().getCamera()
&& !DJISampleApplication.getProductInstance().getCamera().isMediaDownloadModeSupported()) {
ToastUtils.setResultToToast("Do not support Media list function");
return false;
} else {
ToastUtils.setResultToToast(getContext().getString(R.string.playback_disconnected));
return false;
}
}
return true;
}
public MediaPlaybackView(Context context) {
super(context);
initUI(context);
initDJIMedia();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
}
@NonNull
@Override
public String getHint() {
return this.getClass().getSimpleName() + ".java";
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
DJISampleApplication.getEventBus().post(new MainActivity.RequestStartFullScreenEvent());
isDialogAllowable = true;
}
@Override
protected void onDetachedFromWindow() {
DJISampleApplication.getEventBus().post(new MainActivity.RequestEndFullScreenEvent());
try {
DJISampleApplication.getProductInstance()
.getCamera()
.setMode(SettingsDefinitions.CameraMode.SHOOT_PHOTO, null);
} catch (Exception e) {
e.printStackTrace();
}
if (DJIMediaList != null) {
DJIMediaList.clear();
}
super.onDetachedFromWindow();
}
@Override
public void onUpdate(MediaManager.VideoPlaybackState videoPlaybackState) {
post(new Runnable() {
@Override
public void run() {
ToastUtils.setResultToToast(" VideoPlaybackState on Result");
}
});
updateTextView(videoPlaybackState);
}
@Override
public int getDescription() {
return R.string.camera_listview_media_playback;
}
private class FileListAdapter extends BaseAdapter {
class ItemHolder {
TextView file_name;
Button btnPlayVideo;
}
public FileListAdapter() {
super();
}
@SuppressLint("InflateParams")
@Override
public View getView(final int index, View convertView, ViewGroup parent) {
final ItemHolder mItemHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.media_info_item, null);
mItemHolder = new ItemHolder();
mItemHolder.file_name = (TextView) convertView.findViewById(R.id.filename);
mItemHolder.btnPlayVideo = (Button) convertView.findViewById(R.id.btn_PlayVideo);
convertView.setTag(mItemHolder);
} else {
mItemHolder = (ItemHolder) convertView.getTag();
}
if (DJIMediaList.size() != 0) {
final MediaFile media = DJIMediaList.get(index);
if (media.getMediaType() != MediaFile.MediaType.M4V
&& media.getMediaType() != MediaFile.MediaType.MOV
&& media.getMediaType() != MediaFile.MediaType.MP4) {
mItemHolder.btnPlayVideo.setVisibility(View.GONE);
} else {
mItemHolder.btnPlayVideo.setVisibility(View.VISIBLE);
}
mItemHolder.file_name.setText(DJIMediaList.get(index).getFileName());
mItemHolder.btnPlayVideo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mediaManager.playVideoMediaFile(DJIMediaList.get(index),
new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (null != error) {
handler.sendMessage(handler.obtainMessage(SHOW_TOAST,
error.getDescription()));
} else {
Log.e(TAG, "Play Video");
}
}
});
}
});
} else {
mItemHolder.file_name.setText("");
}
return convertView;
}
@Override
public int getCount() {
if (null != DJIMediaList) {
return DJIMediaList.size();
}
return 0;
}
@Override
public Object getItem(int index) {
if (DJIMediaList.size() > index) {
return DJIMediaList.get(index);
}
return null;
}
@Override
public long getItemId(int id) {
return id;
}
}
private void updateTextView(MediaManager.VideoPlaybackState currentVideoPlaybackState) {
final StringBuilder pushInfo = new StringBuilder();
addLineToSB(pushInfo, "Video Playback State", null);
if (currentVideoPlaybackState != null) {
if (currentVideoPlaybackState.getPlayingMediaFile() != null) {
addLineToSB(pushInfo, "media index", currentVideoPlaybackState.getPlayingMediaFile().getID());
addLineToSB(pushInfo, "media size", currentVideoPlaybackState.getPlayingMediaFile().getFileSize());
addLineToSB(pushInfo,
"media duration",
currentVideoPlaybackState.getPlayingMediaFile().getDurationInSeconds());
addLineToSB(pushInfo,
"media created date",
currentVideoPlaybackState.getPlayingMediaFile().getDateCreated());
addLineToSB(pushInfo,
"media orientation",
currentVideoPlaybackState.getPlayingMediaFile().getVideoOrientation());
} else {
addLineToSB(pushInfo, "media index", "None");
}
addLineToSB(pushInfo, "media current position", currentVideoPlaybackState.getPlayingPosition());
addLineToSB(pushInfo, "media current status", currentVideoPlaybackState.getPlaybackStatus());
pushInfo.append("\n");
setResultToText(pushInfo.toString());
} else {
setResultToText("playbackState is null");
}
}
private static void addLineToSB(StringBuilder sb, String name, Object value) {
sb.append(name + ": ").
append(value == null ? "" : value + "").
append("\n");
}
private void setResultToText(String s) {
final String str = s;
post(new Runnable() {
@Override
public void run() {
if (tv_playbackInfo == null) {
Log.e(TAG, "tv_playbackInfo = null");
} else {
tv_playbackInfo.setText(str);
}
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}